package main

import (
	"fmt"
	"unsafe"
)

func main() {

	var a = 'a'
	fmt.Printf("值:%v  类型:%T", a, a) // 默认输出AscII码值

	huanhang()

	// 原样输出
	fmt.Printf("值：%c  类型 %T", a, a) //值：a  类型 int3216

	huanhang()

	// unsafe.Sizeof 没法查看string类型数据所占的存储空间

	// 一个汉字占用3个字节（utf-8) 一个字母占1个字节

	var str = "this"                // 占4个字节
	fmt.Println(unsafe.Sizeof(str)) // 16

	var guo = '国'
	fmt.Printf("值：%v 类型:%T", guo, guo) // Unicode编码10进制，值：22269 类型:int32

	huanhang()
	fmt.Printf("值：%c 类型:%T", guo, guo)
	huanhang()
	// 6、通过循环输出字符串里面的字符
	s := "你好 golang"
	for i := 0; i < len(s); i++ {
		fmt.Printf("%v(%c)", s[i], s[i])
		//fmt.Printf("%c:%c", rune(s[i]), s[i])
	}

	huanhang()

	for i := 0; i < len(s); i++ {
		fmt.Printf("%c:%c", rune(s[i]), s[i])
	}

	huanhang()
	for _, v := range s { // rune 类型
		fmt.Printf("%v:%c", v, v)
	}

	huanhang()
	// 7、修改字符串
	s1 := "bug"
	//s1[0] = 'p'  //Cannot assign to s1[0]
	byteStr := []byte(s1)
	byteStr[0] = 'p'
	fmt.Println(string(byteStr))

	s2 := "白菜 haha"
	runeStr := []rune(s2)
	runeStr[0] = '吃'
	fmt.Println(string(runeStr))

}

func huanhang() {
	fmt.Println()
}
